home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / h / buf.h < prev    next >
Encoding:
C/C++ Source or Header  |  1990-12-19  |  5.5 KB  |  157 lines

  1. /*    @(#)buf.h 1.1 86/09/27 SMI; from UCB 4.22 83/07/01    */
  2.  
  3. /*
  4.  * The header for buffers in the buffer pool and otherwise used
  5.  * to describe a block i/o request is given here.  The routines
  6.  * which manipulate these things are given in bio.c.
  7.  *
  8.  * Each buffer in the pool is usually doubly linked into 2 lists:
  9.  * hashed into a chain by <dev,blkno> so it can be located in the cache,
  10.  * and (usually) on (one of several) queues.  These lists are circular and
  11.  * doubly linked for easy removal.
  12.  *
  13.  * There are currently three queues for buffers:
  14.  *    one for buffers which must be kept permanently (super blocks)
  15.  *     one for buffers containing ``useful'' information (the cache)
  16.  *    one for buffers containing ``non-useful'' information
  17.  *        (and empty buffers, pushed onto the front)
  18.  * The latter two queues contain the buffers which are available for
  19.  * reallocation, are kept in lru order.  When not on one of these queues,
  20.  * the buffers are ``checked out'' to drivers which use the available list
  21.  * pointers to keep track of them in their i/o active queues.
  22.  */
  23.  
  24. /*
  25.  * Bufhd structures used at the head of the hashed buffer queues.
  26.  * We only need three words for these, so this abbreviated
  27.  * definition saves some space.
  28.  */
  29. struct bufhd {
  30.     long    b_flags;        /* see defines below */
  31.     struct    buf *b_forw, *b_back;    /* fwd/bkwd pointer in chain */
  32. };
  33.  
  34. struct buf {
  35.     long    b_flags;        /* too much goes here to describe */
  36.     struct    buf *b_forw, *b_back;    /* hash chain (2 way street) */
  37.     struct    buf *av_forw, *av_back;    /* position on free list if not BUSY */
  38. #define    b_actf    av_forw            /* alternate names for driver queue */
  39. #define    b_actl    av_back            /*    head - isn't history wonderful */
  40.     long    b_bcount;        /* transfer count */
  41.     long    b_bufsize;        /* size of allocated buffer */
  42. #define    b_active b_bcount        /* driver queue head: drive active */
  43.     short    b_error;        /* returned after I/O */
  44.     dev_t    b_dev;            /* major+minor device name */
  45.     union {
  46.         caddr_t b_addr;        /* low order core address */
  47.         int    *b_words;        /* words for clearing */
  48.         struct fs *b_fs;        /* superblocks */
  49.         struct csum *b_cs;        /* superblock summary information */
  50.         struct cg *b_cg;        /* cylinder group block */
  51.         struct dinode *b_dino;    /* ilist */
  52.         daddr_t *b_daddr;        /* indirect block */
  53.     } b_un;
  54.     daddr_t    b_blkno;        /* block # on device */
  55.     long    b_resid;        /* words not transferred after error */
  56. #define    b_errcnt b_resid        /* while i/o in progress: # retries */
  57.     struct  proc *b_proc;        /* proc doing physical or swap I/O */
  58.     int    (*b_iodone)();        /* function called by iodone */
  59.     struct    vnode *b_vp;        /* vnode associated with block */
  60.     int    b_pfcent;        /* center page when swapping cluster */
  61. #ifdef sun
  62.     caddr_t    b_saddr;        /* saved address */
  63.     short    b_kmx;            /* saved kernelmap index */
  64.     short    b_npte;            /* number of pte's mapped */
  65. #endif
  66. };
  67.  
  68. #define    BQUEUES        4        /* number of free buffer queues */
  69.  
  70. #define    BQ_LOCKED    0        /* super-blocks &c */
  71. #define    BQ_LRU        1        /* lru, useful buffers */
  72. #define    BQ_AGE        2        /* rubbish */
  73. #define    BQ_EMPTY    3        /* buffer headers with no memory */
  74.  
  75. /*
  76.  * These flags are kept in b_flags.
  77.  */
  78. #define    B_WRITE        0x000000    /* non-read pseudo-flag */
  79. #define    B_READ        0x000001    /* read when I/O occurs */
  80. #define    B_DONE        0x000002    /* transaction finished */
  81. #define    B_ERROR        0x000004    /* transaction aborted */
  82. #define    B_BUSY        0x000008    /* not on av_forw/back list */
  83. #define    B_PHYS        0x000010    /* physical IO */
  84. #define    B_XXX        0x000020    /* was B_MAP, alloc UNIBUS on pdp-11 */
  85. #define    B_WANTED    0x000040    /* issue wakeup when BUSY goes off */
  86. #define    B_AGE        0x000080    /* delayed write for correct aging */
  87. #define    B_ASYNC        0x000100    /* don't wait for I/O completion */
  88. #define    B_DELWRI    0x000200    /* write at exit of avail list */
  89. #define    B_TAPE        0x000400    /* this is a magtape (no bdwrite) */
  90. #define    B_UAREA        0x000800    /* add u-area to a swap operation */
  91. #define    B_PAGET        0x001000    /* page in/out of page table space */
  92. #define    B_DIRTY        0x002000    /* dirty page to be pushed out async */
  93. #define    B_PGIN        0x004000    /* pagein op, so swap() can count it */
  94. #define    B_CACHE        0x008000    /* did bread find us in the cache ? */
  95. #define    B_INVAL        0x010000    /* does not contain valid info  */
  96. #define    B_LOCKED    0x020000    /* locked in core (not reusable) */
  97. #define    B_HEAD        0x040000    /* a buffer header, not a buffer */
  98. #define    B_BAD        0x100000    /* bad block revectoring in progress */
  99. #define    B_CALL        0x200000    /* call b_iodone from iodone */
  100. #define    B_NOCACHE    0x400000    /* don't cache block when released */
  101.  
  102. /*
  103.  * Insq/Remq for the buffer hash lists.
  104.  */
  105. #define    bremhash(bp) { \
  106.     (bp)->b_back->b_forw = (bp)->b_forw; \
  107.     (bp)->b_forw->b_back = (bp)->b_back; \
  108. }
  109. #define    binshash(bp, dp) { \
  110.     (bp)->b_forw = (dp)->b_forw; \
  111.     (bp)->b_back = (dp); \
  112.     (dp)->b_forw->b_back = (bp); \
  113.     (dp)->b_forw = (bp); \
  114. }
  115.  
  116. /*
  117.  * Insq/Remq for the buffer free lists.
  118.  */
  119. #define    bremfree(bp) { \
  120.     (bp)->av_back->av_forw = (bp)->av_forw; \
  121.     (bp)->av_forw->av_back = (bp)->av_back; \
  122. }
  123. #define    binsheadfree(bp, dp) { \
  124.     (dp)->av_forw->av_back = (bp); \
  125.     (bp)->av_forw = (dp)->av_forw; \
  126.     (dp)->av_forw = (bp); \
  127.     (bp)->av_back = (dp); \
  128. }
  129. #define    binstailfree(bp, dp) { \
  130.     (dp)->av_back->av_forw = (bp); \
  131.     (bp)->av_back = (dp)->av_back; \
  132.     (dp)->av_back = (bp); \
  133.     (bp)->av_forw = (dp); \
  134. }
  135.  
  136. /*
  137.  * Take a buffer off the free list it's on and
  138.  * mark it as being use (B_BUSY) by a device.
  139.  */
  140. #define    notavail(bp) { \
  141.     int x = spl6(); \
  142.     bremfree(bp); \
  143.     (bp)->b_flags |= B_BUSY; \
  144.     (void) splx(x); \
  145. }
  146.  
  147. #define    iodone    biodone
  148. #define    iowait    biowait
  149.  
  150. /*
  151.  * Zero out a buffer's data portion.
  152.  */
  153. #define    clrbuf(bp) { \
  154.     blkclr(bp->b_un.b_addr, (u_int)bp->b_bcount); \
  155.     bp->b_resid = 0; \
  156. }
  157.